package com.example.kotlintest.func

import com.example.utils.jian
import com.example.utils.jiantou

//高阶函数

/*对高阶函数的理解
定义一个函数表达式，类似于java的抽象方法
让高阶函数在调用时实现

https://zhuanlan.zhihu.com/p/495402574
Kotlin 高阶函数详解

https://blog.csdn.net/mr_hmgo/article/details/118935302
Kotlin——高阶函数
*/

fun main() {

    methodForAbstract()
//  (使用::操作符)
//  将methodForAbstract()作为参数传递给高阶函数squareInt
    var methodResult= squareInt (::methodForAbstract)
    println("methodResult = $methodResult")

    var resultInt = squareInt {
        -1 * -1
    }
    println(resultInt)

    var resultString = squareString {
        -1 * -1
    }
    println(resultString)

    var squareWithInt = squareWithInt(2, ::methodForAbstract)
    println("squareWithInt = $squareWithInt")

    var squareWithIntlanmda = squareWithInt(2){
        it*it
    }
    println("squareWithIntlanmda = $squareWithIntlanmda")
}


/**
 * 定义一个普通方法，用来抽象 函数表达式 body:()->Int
 */
fun methodForAbstract() :Int{
    return 0;
}

/**
 * 定义一个普通方法，用来抽象 函数表达式 body:()->Int
 */
fun methodForAbstract(x:Int) :Int{
    return x*x;
}

/**
定义一个高阶方法
表达式 返回结果为Int
方法返回值类型为Int
 */
fun squareInt(body:()->Int):Int{
    return body();
}

/**
 *定义一个高阶方法
 *表达式 返回结果为Int类型
 *方法返回值类型为String
 */
fun squareString(body:()->Int):String{
  return "${body()}";
}

fun squareWithInt(x: Int,body: (Int) -> Int):Int{

    return body(x);
}
